package com.kun.peng.system.service;

import com.kun.peng.system.domain.Menu;
import com.kun.peng.system.service.dto.MenuDto;
import com.kun.peng.system.service.dto.MenuQuery;

import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;
import java.util.Set;

/**
 * Created on 2021/11/19.
 *
 * @author xuebaopeng
 * Description
 */
public interface MenuService {

    /**
     * 查询全部数据
     * @param criteria 条件
     * @param isQuery
     * @throws Exception
     * @return /
     */
    List<MenuDto> queryAll(MenuQuery criteria, Boolean isQuery) throws Exception;
    /**
     * 根据ID查询
     * @param id
     * @return
     */
    MenuDto findMenuById(long id);
    /**
     * 创建
     * @param menu
     */
    void create(Menu menu);

    /**
     * 编辑
     * @param menu
     */
    void update(Menu menu);
    /**
     * 获取所有子节点，包含自身ID
     * @param menuList
     * @param menuSet
     * @return
     */
    Set<Menu> getChildMenus(List<Menu> menuList, Set<Menu> menuSet);

    /**
     * 构建菜单树
     * @param menuDtos 原始数据
     * @return
     */
    List<MenuDto> buildTree(List<MenuDto> menuDtos);

    /**
     * 构建菜单树
     * @param menuDtos
     * @return /
     */
    Object buildMenus(List<MenuDto> menuDtos);

    /**
     * 根据ID查询
     * @param id
     * @return
     */
    Menu findOne(Long id);

    /**
     * 删除
     * @param menuSet
     */
    void delete(Set<Menu> menuSet);

    /**
     * 导出
     * @param queryAll 待导出的数据
     * @param response
     * @throws IOException
     */
    void download(List<MenuDto> queryAll, HttpServletResponse response) throws IOException;

    /**
     * 懒加载菜单数据
     * @param pid
     * @return
     */
    List<MenuDto> getMenus(Long pid);

    /**
    * 根据ID获取同级与上级数据
     * @param menuDto
     * @param objects
     * @return
     */
    List<MenuDto> getSuperior(MenuDto menuDto, List<Menu> objects);

    /**
     * 根据当前用户获取菜单
     * @param currentUserId
     * @return /
     */
    List<MenuDto> findByUser(Long currentUserId);


    Set<Menu> selectMenusByRoleId(Long roleId);
}
